package com.yotadevices.sdk.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import com.yotadevices.sdk.Drawer;
/**
* @hide
*
* Utils for bitmap preprocessing for displaying them on back screen.
*
*
*/
public class BitmapUtils {
public static final int DITHER_ATKINSON = 1;
public static final int DITHER_FLOYD_STEINBERG= 2;
/**
* Makes standard preprocessing for the image that should be drawn on BS: <BR>
* - Bitmap sharpening <BR>
* - Contrast and brightness adjustment <BR>
* <BR>
* This function is for back-compatibility
*
* @param bitmap
* input bitmap
* @return new bitmap
*/
public static Bitmap prepareImageForBS(Bitmap bitmap) {
return BitmapUtils.sharpenBitmap(BitmapUtils.changeBitmapContrastBrightness(bitmap, 1.2f, -30), 0.15f);
}
/**
* Sharpens the Bitmap
*
* @param bitmap
* input bitmap
* @param weight
* Should >= 0. 0 is default
* @return new bitmap
*/
public static Bitmap sharpenBitmap(Bitmap bitmap, float weight) {
com.yotadevices.yotaphone2.sdk.EpdUtils.sharpenBitmap(bitmap, weight);
return bitmap;
}
/**
* Dithers the Bitmap
*
* @param bitmap
* input bitmap
* @param ditheringAlgorithm
* Dithering algorithm to use. Can be DITHER_ATKINSON or DITHER_FLOYD_STEINBERG
* @param binary
* true if resulting pircure should have only pure black and pure white pixels. Use this for drawing fast animations with WAVEFORM_A2;<br/>
* false if resulting pircure should have full 16-colors greyscale. Use this for drawing beautiful well-detailed images.
* @return new bitmap<br/><br/>
*
* The palette of returned bitmap will consist only of following colors. Please notice that all transparency will be gone.<br/>
* 0xff000000<br/>
* 0xff101010<br/>
* 0xff212121<br/>
* 0xff313131<br/>
* 0xff434343<br/>
* 0xff535353<br/>
* 0xff646464<br/>
* 0xff747474<br/>
* 0xff8b8b8b<br/>
* 0xff9b9b9b<br/>
* 0xffacacac<br/>
* 0xffbbbbbb<br/>
* 0xffcecece<br/>
* 0xffdedede<br/>
* 0xffefefef<br/>
* 0xffffffff<br/>
*/
public static Bitmap ditherBitmap(Bitmap bitmap, int ditheringAlgorithm, boolean binary) {
com.yotadevices.yotaphone2.sdk.EpdUtils.ditherBitmap(bitmap, ditheringAlgorithm, binary);
return bitmap;
}
/**
* Sharpens the Bitmap
*
* @param context
* context
* @param bitmap
* input bitmap
* @param weight
* Should >= 0. 0 is default
* @return new bitmap
*/
public static Bitmap sharpenBitmap(Context context, Bitmap bitmap, float weight) {
RenderScript mRS = RenderScript.create(context);
Allocation mInAllocation = Allocation.createFromBitmap(mRS, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Allocation mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());
ScriptIntrinsicConvolve3x3 d = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS));
d.setCoefficients(new float[] { -weight, -weight, -weight, -weight, 8 * weight + 1, -weight, -weight, -weight, -weight });
d.setInput(mInAllocation);
d.forEach(mOutAllocation);
mOutAllocation.copyTo(bitmap);
mRS.destroy();
return bitmap;
}
/**
* Changes the contrast and brightness of the bitmap
*
* @param bitmap
* input bitmap
* @param contrast
* 0..10 1 is default
* @param brightness
* -255..255 0 is default
* @return new bitmap
*/
public static Bitmap changeBitmapContrastBrightness(Bitmap bitmap, float contrast, float brightness) {
ColorMatrix cm = new ColorMatrix(new float[] { contrast, 0, 0, 0, brightness, 0, contrast, 0, 0, brightness, 0, 0, contrast, 0, brightness, 0, 0, 0, 1, 0 });
Bitmap ret = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
Canvas canvas = new Canvas(ret);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap, 0, 0, paint);
return ret;
}
/**
* Makes grayscale-bitmap
*
* @param bmpOriginal
* - input bitmap
* @param width
* - width of input bitmap
* @param height
* - height of input bitmap
* @return new grayscaled bitmap
*/
public static final Bitmap toGrayscale(Bitmap bmpOriginal, int width, int height) {
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
paint.setFilterBitmap(true);
c.drawBitmap(bmpOriginal, null, new Rect(0, 0, width, height), paint);
return bmpGrayscale;
}
public static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
return resizedBitmap;
}
}